#ifndef BSP_KET_H
#define BSP_KET_H

#include "gpio.h"

typedef enum
{
    IDLE_STATE = 0,          // 空闲
    PRESS_DETECTED_STATE,    // 按键按下
    RELEASE_DETECTED_STATE,  // 按键释放
    SHORT_PRESS_STATE,       // 短按
    LONG_PRESS_STATE,        // 长按
    DOUBLE_PRESS_STATE,      // 双击
    LONG_PRESS_STATE_END     // 长按结束状态
} ButtonState_e;

typedef enum
{
    Flag_IDLE = 0,
    Flag_RUN,
} ButtonFlag_e;

typedef struct
{
    uint16_t Key_Pin;
    GPIO_TypeDef* Key_Port;
} ButtonHardware_t;

typedef struct
{
    ButtonFlag_e ButtonFlag;
    ButtonState_e ButtonState;
    ButtonHardware_t ButtonHardware;
    uint16_t SHORT_CLICK_THRESHOLD;  // 这个是第一次松开时间和第二次按下时间的判断时长
    uint16_t LONG_PRESS_THRESHOLD;   // 定义长按的时间阈值（以1ms时基为单位）
    uint16_t PRESS_Time;             // 判断毛刺时长
    uint16_t BUTTON_ERROR_Time;      // 按键长久状态卡死阈值
    uint32_t pressStartTime;         // 记录按下时间
    uint32_t lastReleaseTime;        // 记录上一次释放时间
    uint32_t ReleaseTime;
} Button_t;

void BSP_Key_Init(Button_t* Button);
void Key_Loop(Button_t* Button, uint16_t key_value, uint8_t action);

#endif
